﻿using DevExpress.XtraEditors;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using MESQWinform;
using MesProjectWinform.BasicData.Entity;
using Newtonsoft.Json;
using System.IO;

namespace MesProjectWinform.BasicData.基础实现.gongwei
{
    public partial class gongadd : DevExpress.XtraEditors.XtraForm
    {
        // 存储产线信息的列表
        private List<Productionline> productionlineList = new List<Productionline>();
        // 存储选中的产线ID
        private string selectedProductionlineId;
        // 定义刷新父窗体的委托
        public delegate void RefreshParentDelegate();
        // 声明刷新事件
        public event RefreshParentDelegate RefreshParentEvent;
        // 序号存储文件路径
        private readonly string sequenceFilePath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "WorkstationSequence.txt");
        // 日期格式化字符串
        private readonly string dateFormat = "yyMMdd";
        
        public gongadd()
        {
            InitializeComponent();
            
            // 设置窗体居中显示
            this.StartPosition = FormStartPosition.CenterScreen;
            
            LoadGongXuData(); // 加载工序数据
            
            // 窗体加载时获取产线列表
            this.Load += Gongadd_Load;
            // 添加产线选择事件
            comboBox1.SelectedIndexChanged += comboBox1_SelectedIndexChanged;
        }
        
        /// <summary>
        /// 窗体加载事件
        /// </summary>
        private async void Gongadd_Load(object sender, EventArgs e)
        {
            // 设置工位编码文本框为只读
            textEdit1.Properties.ReadOnly = true;
            // 生成自动递增编码
            GenerateAutoIncrementCode();
            
            await LoadAllProductionlines();
        }

        /// <summary>
        /// 生成自动递增的工位编码
        /// </summary>
        private void GenerateAutoIncrementCode()
        {
            try
            {
                // 生成当前日期部分 格式：yyMMdd
                string today = DateTime.Now.ToString(dateFormat);
                
                // 读取序号文件，获取当前最大序号
                int currentSequence = 1; // 默认从1开始
                string lastDate = string.Empty;
                
                if (File.Exists(sequenceFilePath))
                {
                    string[] fileContent = File.ReadAllLines(sequenceFilePath);
                    if (fileContent.Length >= 2)
                    {
                        lastDate = fileContent[0]; // 第一行存储日期
                        int.TryParse(fileContent[1], out currentSequence); // 第二行存储序号
                        
                        // 如果是新的一天，重置序号为1
                        if (lastDate != today)
                        {
                            currentSequence = 1;
                        }
                        // 注意：此处不自增序号，只显示当前序号
                    }
                }
                
                // 格式化为4位数字，前面补0
                string serialPart = currentSequence.ToString().PadLeft(4, '0');
                
                // 组合最终的编码：GW + 日期 + 4位序号
                string finalCode = "GW" + today + serialPart;
                
                // 设置到文本框
                textEdit1.Text = finalCode;
            }
            catch (Exception ex)
            {
                XtraMessageBox.Show($"生成工位编码时发生错误：{ex.Message}", "错误", MessageBoxButtons.OK, MessageBoxIcon.Error);
                // 生成失败时使用默认编码
                textEdit1.Text = "GW" + DateTime.Now.ToString(dateFormat) + "0001";
            }
        }

        /// <summary>
        /// 保存成功后更新序号
        /// </summary>
        private void UpdateSequenceAfterSuccess()
        {
            try
            {
                // 获取当前日期
                string today = DateTime.Now.ToString(dateFormat);
                int currentSequence = 1;
                
                // 读取当前序号
                if (File.Exists(sequenceFilePath))
                {
                    string[] fileContent = File.ReadAllLines(sequenceFilePath);
                    if (fileContent.Length >= 2)
                    {
                        string lastDate = fileContent[0];
                        int.TryParse(fileContent[1], out currentSequence);
                        
                        // 如果是新的一天，重置序号为1
                        if (lastDate != today)
                        {
                            currentSequence = 1;
                        }
                        else
                        {
                            // 否则序号加1
                            currentSequence++;
                        }
                    }
                }
                
                // 保存更新后的序号到文件
                using (StreamWriter writer = new StreamWriter(sequenceFilePath, false))
                {
                    writer.WriteLine(today);
                    writer.WriteLine(currentSequence.ToString());
                }
            }
            catch (Exception ex)
            {
                // 更新序号失败不影响主流程，可以静默处理
                Console.WriteLine($"更新序号失败：{ex.Message}");
            }
        }

        /// <summary>
        /// 加载工序数据
        /// </summary>
        private void LoadGongXuData()
        {
            // 清空已有项
            comboBox2.Items.Clear();
            
            // 添加工序选项
            comboBox2.Items.Add("拼版投入");
            comboBox2.Items.Add("点胶");
            comboBox2.Items.Add("AOI");
            comboBox2.Items.Add("SPI");
            comboBox2.Items.Add("烘烤");
            comboBox2.Items.Add("22");
            comboBox2.Items.Add("后盖01");
            comboBox2.Items.Add("后盖02");
            
            // 默认选择第一项
            if (comboBox2.Items.Count > 0)
            {
                comboBox2.SelectedIndex = 0;
            }
        }
        
        /// <summary>
        /// 加载所有产线数据
        /// </summary>
        private async Task LoadAllProductionlines()
        {
            try
            {
                // 调用API获取所有产线数据
                string response = await APIClientl.CallApiAsync("api/Productionline/GetAllProductionline", "GET");
                
                // 解析返回的JSON数据
                ProductionlineDto productionlineDto = JsonConvert.DeserializeObject<ProductionlineDto>(response);
                
                // 由于ProductionlineDto已设置默认值，无需检查是否为null
                // 保存产线列表以便后续使用
                productionlineList = productionlineDto.Data;
                
                // 清空下拉框
                comboBox1.Items.Clear();
                
                // 将产线名称添加到下拉框
                foreach (var productionline in productionlineList)
                {
                    comboBox1.Items.Add(productionline.Productionlinename);
                }
                
                // 如果有数据，默认选择第一项
                if (comboBox1.Items.Count > 0)
                {
                    comboBox1.SelectedIndex = 0;
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show($"获取产线数据失败: {ex.Message}", "错误", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }

        /// <summary>
        /// 产线动态获取
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void comboBox1_SelectedIndexChanged(object sender, EventArgs e)
        {
            if (comboBox1.SelectedIndex >= 0 && comboBox1.SelectedIndex < productionlineList.Count)
            {
                // 获取选中的产线对象
                Productionline selectedProductionline = productionlineList[comboBox1.SelectedIndex];
                // 保存选中产线的ID
                selectedProductionlineId = selectedProductionline.Id.ToString();
                
                // 可以在这里更新其他相关控件，例如显示产线描述等
                // 例如：labelControl1.Text = $"产线描述: {selectedProductionline.Productionlinedescription}";
            }
        }
        
        /// <summary>
        /// 工序死数据
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void comboBox2_SelectedIndexChanged(object sender, EventArgs e)
        {
            // 获取选中的工序
            string selectedGongXu = comboBox2.SelectedItem?.ToString();
            
            // 可以根据选中的工序执行相应的操作
            if (!string.IsNullOrEmpty(selectedGongXu))
            {
                // 这里可以添加根据选中工序执行的操作
                // 例如：更新其他控件的显示、加载相关数据等
            }
        }
        
        /// <summary>
        /// 保存
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private async void button2_Click(object sender, EventArgs e)
        {
            try
            {
                // 获取表单数据
                string workstationName = textEdit3.Text.Trim(); // 工位名称
                string workstationCode = textEdit1.Text.Trim(); // 工位编号
                string description = memoEdit1.Text.Trim(); // 工位描述
                
                // 检查必填字段
                if (string.IsNullOrEmpty(workstationCode))
                {
                    XtraMessageBox.Show("请填写工位编号", "提示", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                    return;
                }
                
                if (string.IsNullOrEmpty(selectedProductionlineId))
                {
                    XtraMessageBox.Show("请选择产线", "提示", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                    return;
                }
                
                // 获取选中的工序
                string processId = comboBox2.SelectedItem?.ToString() ?? "";
                if (string.IsNullOrEmpty(processId))
                {
                    XtraMessageBox.Show("请选择工序", "提示", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                    return;
                }
                
                // 获取选中的产线名称
                string productionLineName = comboBox1.SelectedItem?.ToString() ?? "";
                
                // 创建工位对象
                Workstations workstation = new Workstations
                {
                    Workstationname = workstationName, // 工位名称可以为空
                    Workstationcode = workstationCode,
                    Productionid = selectedProductionlineId,
                    Productionlinename = productionLineName,
                    Processid = processId, // 直接添加工序名称
                    Workstationdescription = description,
                    Workstationattributes = " ", // 工位属性可以为空
                    Workstationuserid = " ", // 工位用户可以为空
                    IsDeleted = false,
                    CreatedBy = "admin",
                    CreatedTime = DateTime.Now,
                    UpdatedBy = "张三",
                    UpdatedTime = DateTime.Now
                };
                
                // 将对象序列化为JSON
                string jsonData = JsonConvert.SerializeObject(workstation);
                
                // 调用API添加工位
                string url = "api/WorkstationManag/AddWorkstation";
                string response = await APIClientl.CallApiAsync(url, "POST", jsonData);
                
                // 解析返回结果
                dynamic result = JsonConvert.DeserializeObject(response);
                
                // 保存成功后更新序号
                UpdateSequenceAfterSuccess();
                
                // 显示成功消息
                XtraMessageBox.Show("添加工位成功！", "成功", MessageBoxButtons.OK, MessageBoxIcon.Information);
                
                // 触发刷新父窗体事件
                RefreshParentEvent?.Invoke();
                
                // 关闭窗口
                this.Close();
            }
            catch (Exception ex)
            {
                XtraMessageBox.Show($"添加工位时发生错误：{ex.Message}", "错误", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }
        
        /// <summary>
        /// 重置
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void button1_Click(object sender, EventArgs e)
        {
            // 重新生成自动递增编码
            GenerateAutoIncrementCode();
            // 清空所有输入框
            textEdit3.Text = string.Empty; // 工位名称
            memoEdit1.Text = string.Empty; // 工位描述
            
            // 重置下拉框选择（如果需要的话）
            if (comboBox1.Items.Count > 0)
            {
                comboBox1.SelectedIndex = 0;
            }
            
            if (comboBox2.Items.Count > 0)
            {
                comboBox2.SelectedIndex = 0;
            }
        }
    }
}